package com.inside.demo03;

// 外部类
public class Outer {
    // 外部成员属性
    private String name = "张学友";
    private int age = 35;
    // 定义方法
    public void show() {
        // 定义局部变量  前面省略了 final 常量关键字（）
        // jdk 1.7 需要在局部变量添加，jdk 1.8 自动添加 final
        String address = "局部变量";
        // 局部内部类 不能带有任何的修饰符符号
        class Inner {
            private String phone = "153****4567";
            private String email = "82****@qq.com";
            // 不可以声明静态属性 -- 报错 修饰符 'static' 仅允许在常量变量声明中使用
            //private static String id_card = "xxx";
            // 但是可以声明静态常量
            private final static String title = "可以声明";
            // 局部类的方法
            public void run() {
                // 访问外部类成员属性
                System.out.println(name);// 相当于 Outer.this.name
                System.out.println(Outer.this.name);
                System.out.println(Outer.this.age);
                // 访问局部内部类属性
                System.out.println(this.phone);
                System.out.println(this.email);
                // 访问局部变量
                System.out.println(address);
            }

            // 静态方法也不允许声明 -- 报错
            //public static void go() {
            //    System.out.println("可以声明静态方法！");
            //}
        }
        // 创建局部内部类对象
        Inner inner = new Inner();
        inner.run();

        // 修改s变量 -- 不能修改 运行报错
        /*
        分析：为什么不能修改？为什么前面默认带有final 关键字？
        方法执行完成后，address 变量就（内存里）消失了，但下面创建Inner对象
        对象里面打印了 局部变量，对象存在堆中不会消失吧，那么这时就出现问题了，
        所以局部变量前面都带有 final 常量关键字修饰符的
        */
        // address = "哈哈哈哈"; -- 修改报错
        System.out.println(address);
    }
    public void run() {
        // 无法创建局部内部类
        // new Inner(); -- 无法创建
    }
}
